/*
 * 循环移动
 *
 * 题目链接：https://programming.pku.edu.cn/probset/ce201cde75084b56ad4544229996fbf2/84d328af00a143e3ad83193c49865fda/
 * 作者：lyazj <seeson@pku.edu.cn>
 *
 * 本题所需主要知识点：
 *   - rotate 算法
 *   - https://en.cppreference.com/w/cpp/algorithm/rotate
 */

#include <stdio.h>

int main(void)
{
  // 输入
  int n, m, a[100];
  scanf("%d%d", &n, &m);
  for(int i = 0; i < n; ++i) scanf("%d", &a[i]);

  // 我们让下标 m 指向新序列头元素在老序列中的位置
  m = n - m;

  int b = 0;  // 待旋转序列开头下标
  while(b != m) {
    // 追踪老序列头元素被交换到的位置
    int head = b;

    // 把 a[m:n] 与 a[b:b+n-m] 交换
    for(int i = b, j = m; j < n; ++i, ++j) {
      if(i == head) head = j;
      // 你也可以用临时变量来交换
      a[i] ^= a[j], a[j] ^= a[i], a[i] ^= a[j];
    }

    // a[b:b+n-m] 已经就绪，递归处理 a[b+n-m:n]，把 a[head:n] 旋转至 b+n-m 处
    b += n - m;
    m = head;
  }

  for(int i = 0; i < n; ++i) printf("%s%d", i ? " " : "", a[i]);
  printf("\n");
  return 0;
}
